// pages/cart/index.js
import {
  request
} from "../../resquest/index.js"
import regeneratorRuntime from '../../lib/runtime/runtime';
// 导入封装的promise的微信小程序api
import {
  getSetting,
  chooseAddress,
  openSetting,
  showModal,
  showToast
} from '../../utils/asyncWx.js'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    address: {},
    cart:{},
    allChecked:false,
    // 总价格
    totalPrice:0,
    // 总数量
    totalNum:0
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {


  },
  // 获取用户收货地址 authSetting "scope.address"
  // 调用小程序api wx.chooseAddress()
  // 获取用户对小程序授予获取地址的权限状态scope
  // 1.如果用户同意，scope为true
  // 2.如果从未调取过获取地址，scope为undefine
  // 上面两种都可以直接打开获取收货地址页面
  // 3.如果拒绝，scope为false  要先诱导用户授权
  async handleChooseAddress() {
    try {
      //  1.获取权限状态
      const result = await getSetting();
      const scopeAddress = result.authSetting["scope.address"];
      if (scopeAddress === false) {
        await openSetting();
      }
      let address = await chooseAddress();
      // console.log(address);
      address.all= address.provinceName + address.cityName + address.countyName + address.detailInfo;
      // console.log(address);
      
      wx.setStorageSync("address", address
        );

      // console.log(address);
      // 把获取到的收货地址，添加到缓存
      // console.log(address);
    } catch (err) {
      console.log(err);
    }
  },
  
  // 页面加载完毕，获得本地存储中的地址数据
  onShow: function () {
    // 获取地址缓存
    const address = wx.getStorageSync('address');
    // 获取购物车商品缓存
    const cart = wx.getStorageSync('cart')||[];
    // 全选的实现
    // every方法循环全部，全真返回真，全假返回假
    // 默认为真
    this.setData({
      address
    })
    this.setCartUpdate(cart);
  },
  // 商品的复选框选择事件
// 1.绑定change事件
// 2.获取被修改的商品对象
// 3.选中状态取反
// 4.重新填充回缓存
// 5.重新计算全选
  handleItemChange(e){
    // 1.获取被修改的商品id
    const goods_id = e.currentTarget.dataset.id
    // console.log(goods_id);
    let {cart} = this.data;
    // 找到商品id
    let index = cart.findIndex(v=> v.goods_id===goods_id);
    // 状态取反
    cart[index].checked = !cart[index].checked;
    this.setCartUpdate(cart);  
  },

  // 全选和反选事件
  // 1.全选按钮绑定事件
  // 2.获取变量allChecked取反
  // 3.遍历购物车数组的选中状态,跟随全选按钮状态改变,
  // 4.保存到缓存中
  allCheckedChange(){
    let {allChecked,cart} = this.data;
    allChecked = !allChecked;
    cart.forEach(v=>{
      v.checked = allChecked
    })
    this.setCartUpdate(cart);
  },

  // 商品数量加减按钮功能,并且在数量为1时点击减号弹窗判断是否删除商品
  async handleItemNumEdit(e){
    // 获取参数
    const {operation,id} = e.currentTarget.dataset;
    let {cart}= this.data;
    // 找到商品
    const index = cart.findIndex(v=> v.goods_id===id);
    // 判断条件
    if(cart[index].num===1&&operation===-1){
      const result = await showModal({content:"您是否要删除这个商品?"})
      if(result.confirm){
        cart.splice(index,1);
        this.setCartUpdate(cart)
      }
    }else{
      cart[index].num+= operation;
      this.setCartUpdate(cart)
    }
  },

  // 结算功能
  // 1.判断有没有收货地址
  // 2.判断有没有商品
  // 3.经过之前的验证,跳转到支付页面
  async handlePay(){
    const {address,totalNum} = this.data;
    if(!address.userName){
      await showToast({title:'您还没有选择收货地址'})
      return
    }else if(totalNum ===0){
      await showToast({title:'您还没有选购商品'})
      return
    }else{
      wx.navigateTo({
        url: '/pages/pay/index'
      })
    }
  },

  // 购物车页面更新封装的函数
  // 其他对页面操作的函数,只需要整理好cart,调用此函数,就能刷新页面的显示
  setCartUpdate(cart){
    let allChecked = true;
    let totalPrice=0;
    let totalNum = 0;
    cart.forEach(v => {
      if(v.checked){
        totalPrice += v.num * v.goods_price;
        totalNum += v.num;
      }else{
        allChecked = false;
      }
    });
    // 如果数组为空，则默认未选中
    allChecked = cart.length!=0?allChecked:false;
    
    // console.log(cart);
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    })
    wx.setStorageSync("cart", cart)
  }

})


